import { z } from 'zod';
import { ApiProperty } from '@nestjs/swagger';
// 创建用户的验证 schema
export const createUserSchema = z.object({
  userName: z.string().min(2, '用户账号至少需要2个字符').max(30, '用户账号最多30个字符'),
  nickName: z.string().min(2, '用户昵称至少需要2个字符').max(30, '用户昵称最多30个字符'),
  userType: z.string().length(2).default('00'),
  deptId: z.number().int().optional(),
  email: z.string().email('请输入有效的电子邮件地址').max(50, '邮箱最多50个字符').default(''),
  phonenumber: z.string().max(11, '手机号码最多11个字符').default(''),
  sex: z.enum(['0', '1', '2']).default('0'), // 0-未知, 1-男, 2-女
  password: z.string().min(6, '密码至少需要6个字符').max(200, '密码最多200个字符'),
  status: z.enum(['0', '1']).default('0'), // 0-正常, 1-禁用
  remark: z.string().max(500, '备注最多500个字符').optional(),
  avatar: z.string().max(255, '头像地址最多255个字符').default(''),
});

// 更新用户的验证 schema
export const updateUserSchema = z.object({
  userName: z.string().min(2, '用户账号至少需要2个字符').max(30, '用户账号最多30个字符').optional(),
  nickName: z.string().min(2, '用户昵称至少需要2个字符').max(30, '用户昵称最多30个字符').optional(),
  userType: z.string().length(2).optional(),
  deptId: z.number().int().optional(),
  email: z.string().email('请输入有效的电子邮件地址').max(50, '邮箱最多50个字符').optional(),
  phonenumber: z.string().max(11, '手机号码最多11个字符').optional(),
  sex: z.enum(['0', '1', '2']).optional(),
  password: z.string().min(6, '密码至少需要6个字符').max(200, '密码最多200个字符').optional(),
  status: z.enum(['0', '1']).optional(),
  remark: z.string().max(500, '备注最多500个字符').optional(),
  avatar: z.string().max(255, '头像地址最多255个字符').optional(),
  updateBy: z.string().max(64, '更新者最多64个字符').optional(),
}).refine(data => Object.keys(data).length > 0, {
  message: '至少需要提供一个字段进行更新',
});

// 参数验证 schema
export const paramSchema = z.object({
  id: z.string().refine((val) => !isNaN(Number(val)), {
    message: 'ID 必须是数字',
  }),
});

// 查询用户参数 schema
export const queryUserSchema = z.object({
  userName: z.string().optional(), // 用户账号模糊查询
  nickName: z.string().optional(), // 用户昵称模糊查询
  phonenumber: z.string().optional(), // 手机号码模糊查询
  status: z.enum(['0', '1']).optional(), // 状态筛选
  deptId: z.string().transform(Number).pipe(z.number().int()).optional(), // 部门ID筛选
  pageNum: z.string().transform(Number).pipe(z.number().int().min(1)).optional().default('1'),
  pageSize: z.string().transform(Number).pipe(z.number().int().min(1).max(100)).optional().default('10'),
});

// 导出类型
export type CreateUserDto = z.infer<typeof createUserSchema>;
export type UpdateUserDto = z.infer<typeof updateUserSchema>;
export type ParamDto = z.infer<typeof paramSchema>;
export type QueryUserDto = z.infer<typeof queryUserSchema>;

// todo 使用 nestjs-zod 代替 zod 
// class CredentialsDto extends ParamDto(paramSchema) {}